#include <stdio.h>
#include "aoaoutil.h"

uint16_t aut_atou16(uint8_t *a)
{
    return *(uint16_t *)a;
}

uint32_t aut_atou32(uint8_t *a)
{
    return *(uint32_t *)a;
}

uint64_t aut_atou64(uint8_t *a)
{
    return *(uint64_t *)a;
}

void aut_afromu16(uint8_t *a, uint16_t v)
{
    *(uint16_t *)a = v;
}

void aut_afromu32(uint8_t *a, uint32_t v)
{
    *(uint32_t *)a = v;
}

void aut_afromu64(uint8_t *a, uint64_t v)
{
    *(uint64_t *)a = v;
}

/// big endian
uint16_t aut_atou16_be(uint8_t *a)
{
    return (uint16_t)((a[0] << 8) | a[1]);
}

uint32_t aut_atou32_be(uint8_t *a)
{
    uint32_t v = 0;
    v |= ((uint32_t)aut_atou16_be(a + 0) << 16);
    v |= ((uint32_t)aut_atou16_be(a + 2) << 0);
    return v;
}

uint64_t aut_atou64_be(uint8_t *a)
{
    uint64_t v = 0;
    v |= ((uint64_t)aut_atou32_be(a + 0) << 32);
    v |= ((uint64_t)aut_atou32_be(a + 4) << 0);
    return v;
}

void aut_afromu16_be(uint8_t *a, uint16_t v)
{
    a[0] = (v >> 8) & 0xFF;
    a[1] = (v >> 0) & 0xFF;
}

void aut_afromu32_be(uint8_t *a, uint32_t v)
{
    aut_afromu16_be(a + 0, v >> 16);
    aut_afromu16_be(a + 2, v >> 0);
}

void aut_afromu64_be(uint8_t *a, uint64_t v)
{
    aut_afromu32_be(a + 0, v >> 32);
    aut_afromu32_be(a + 4, v >> 0);
}

/// little endian
uint16_t aut_atou16_le(uint8_t *a)
{
    return (uint16_t)((a[1] << 8) | a[0]);
}

uint32_t aut_atou32_le(uint8_t *a)
{
    uint32_t v = 0;
    v |= ((uint32_t)aut_atou16_le(a + 0) << 0);
    v |= ((uint32_t)aut_atou16_le(a + 2) << 16);
    return v;
}

uint64_t aut_atou64_le(uint8_t *a)
{
    uint64_t v = 0;
    v |= ((uint64_t)aut_atou32_le(a + 0) << 0);
    v |= ((uint64_t)aut_atou32_le(a + 4) << 32);
    return v;
}

void aut_afromu16_le(uint8_t *a, uint16_t v)
{
    a[0] = (v >> 0) & 0xFF;
    a[1] = (v >> 8) & 0xFF;
}

void aut_afromu32_le(uint8_t *a, uint32_t v)
{
    aut_afromu16_le(a + 0, v >> 0);
    aut_afromu16_le(a + 2, v >> 16);
}

void aut_afromu64_le(uint8_t *a, uint64_t v)
{
    aut_afromu32_le(a + 0, v >> 0);
    aut_afromu32_le(a + 4, v >> 32);
}
